package game.Russian;

import java.util.Arrays;

public class Option {

	private static int x=0,y=3;
	private static boolean OptionOver=false;//此次操作是否完成

	//左右下，移动方块
	public static Matrix yMove(TetrisBase te,TetrisBlock bl,int ymove) {
		//偏移量
		y+=ymove;
		//当方块右侧出界时，判断是否出现有效数据外溢的情况
		if(y+bl.getColumn()>te.getColumn() || y<0) {
			if(y<0) {
				if(bl.isValueByColumn(-y-1)) {
					y-=ymove;
				}
			}else {
				int tempY=te.getColumn()-y;
				if(bl.isValueByColumn(tempY)) {
					y-=ymove;
				}
			}
		}

		Matrix next=te.add(bl,x,y);
		if(isCoincide(next)) {
			y-=ymove;
		}

		return te.add(bl, x, y);
	}

	//旋转方块
	public static Matrix flip(TetrisBase te,TetrisBlock bl) {
		bl.rightRotate();

		if(isOut(te, bl)) {
			bl.leftRotate(90);
		}

		Matrix result=te.add(bl,x,y);
		if(isCoincide(result)) {
			bl.leftRotate(90);
		}

		return te.add(bl, x, y);
	}

	//旋转后，判断是否出现越界现象
	private static boolean isOut(TetrisBase te,TetrisBlock bl) {
		//左越界处理
		if(y<0) {
			int moveY=0;
			while(moveY<-y) {
				if(bl.isValueByColumn(moveY++)) {
					return true;
				}
			}
		}
		//右越界处理
		if(y+bl.getColumn()>te.getColumn()) {
			int moveY=te.getColumn()-y;
			while(moveY>0) {
				if(bl.isValueByColumn(moveY--)) {
					return true;
				}
			}
		}

		if(x+bl.getRow()>te.getRow()) {
			int moveX=te.getRow()-x;
			while(moveX>0) {
				if(bl.isValueByRow(moveX)) {
					return true;
				}
			}
		}

		return false;
	}

	/*
	 * 让方块继续下移一个单位后：
	 * 1.逐行判断Tetris和Block是否有重合（Tetris中含有2）
	 * 2.如果有重合部分，说明当前是最后一步。返回true，反之返回false。
	 */
	public static Matrix moveDown(TetrisBase te,TetrisBlock bl,int xmove) {
		x+=xmove;
		Matrix next=te.add(bl, x, y);
		if(x+bl.getRow()>=te.getRow()) {
			int tempX=te.getRow()-x;
			if(bl.isValueByRow(tempX)) {
				x-=xmove;
				OptionOver=true;
				return te.add(bl,x,y);
			}
		}

		if(isCoincide(next)) {
			OptionOver=true;
			x-=xmove;
			return te.add(bl,x,y);
		}

		return next;
	}

	//判断是否有重合的部分（值等于2）
	public static boolean isCoincide(Matrix mart) {
		if(mart==null) return false;

		for(int i=0;i<mart.getRow();i++) {
			if(Arrays.toString(mart.get()[i]).contains("2")) {
				return true;
			}
		}

		return false;
	}


	public static void rest(Matrix newMatrix) {
		x=0;
		y=newMatrix.getRow();
		OptionOver=false;
	}

	public static boolean isOption() {
		return OptionOver;
	}

	//测试
	public static void printTetris(Matrix t) {

		if(t==null) return;

		for(int i=0;i<TetrisBase.column+2;i++) {
			System.out.print("==");
		}
		System.out.println();
		for(int i=0;i<TetrisBase.row;i++) {
			for(int j=0;j<TetrisBase.column;j++) {
				if(j==0) System.out.print("||");
				System.out.print(t.get()[i][j]==Matrix.GrapVal?"██":"  ");
			}
			System.out.println("||");
		}
		for(int i=0;i<TetrisBase.column+2;i++) {
			System.out.print("==");
		}
		System.out.println();
	}

}
